package service

import (
	"dsc-server/domain/dto"
	"dsc-server/pkg/model"
	"fmt"

	"gorm.io/gorm"
)

// DataSourceService 处理数据源相关的服务
type DataSourceService struct {
	DB *gorm.DB
}

// NewDataSourceService 创建DataSourceService实例
func NewDataSourceService(db *gorm.DB) *DataSourceService {
	return &DataSourceService{DB: db}
}

// Add 添加数据源
func (s *DataSourceService) Add(datasource *model.Datasource) dto.Result {
	if err := s.DB.Create(datasource).Error; err != nil {
		return dto.FailureMessage(nil, fmt.Sprintf("添加失败: %v", err))
	}

	return dto.SuccessMessage(nil, "添加成功")
}

// Update 更新数据源
func (s *DataSourceService) Update(datasource *model.Datasource) dto.Result {
	if err := s.DB.Model(&model.Datasource{}).Where("id = ?", datasource.ID).Updates(datasource).Error; err != nil {
		return dto.FailureMessage(nil, fmt.Sprintf("更新失败: %v", err))
	}

	// 清除缓存
	// TODO: 实现缓存清除逻辑

	return dto.SuccessMessage(nil, "更新成功")
}

// Delete 删除数据源
func (s *DataSourceService) Delete(id uint) dto.Result {
	// 检查数据源是否被API配置使用
	var count int64
	if err := s.DB.Model(&model.ApiConfig{}).Where("datasource_id = ? AND is_deleted = 0", id).Count(&count).Error; err != nil {
		return dto.FailureMessage(nil, fmt.Sprintf("检查数据源使用情况失败: %v", err))
	}

	if count > 0 {
		return dto.FailureMessage(nil, "该数据源已经被使用，不可删除")
	}

	// 删除数据源
	if err := s.DB.Model(&model.Datasource{}).Where("id = ?", id).Update("is_deleted", 1).Error; err != nil {
		return dto.FailureMessage(nil, fmt.Sprintf("删除失败: %v", err))
	}

	// 清除连接池
	// TODO: 实现连接池清除逻辑

	return dto.SuccessMessage(nil, "删除成功")
}

// Detail 获取数据源详情
func (s *DataSourceService) Detail(id uint) (*model.Datasource, error) {
	var datasource model.Datasource
	result := s.DB.Where("id = ? AND is_deleted = 0", id).First(&datasource)

	// 缓存逻辑
	// TODO: 实现缓存逻辑

	return &datasource, result.Error
}

// GetAll 获取所有数据源
func (s *DataSourceService) GetAll() ([]*model.Datasource, error) {
	var datasources []*model.Datasource
	result := s.DB.Where("is_deleted = 0").Find(&datasources)
	return datasources, result.Error
}

// GetDBType 获取数据库类型
func (s *DataSourceService) GetDBType(id uint) (string, error) {
	var datasource model.Datasource
	result := s.DB.Select("type").Where("id = ? AND is_deleted = 0", id).First(&datasource)
	return datasource.Type, result.Error
}
